package javase.CollectionAndMap.Collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;

/**
 * 集合的迭代方式
 * 注意：加强foreach循环 本质上就是  Iterator迭代器
 *
 * 思考：如何解决 ConcurrentModificationException 并发修改异常？
 * 1.使用Iterator迭代器，自身提供的remove()进行移除元素
 * 2.使用通过下标循环迭代，进行移除操作
 * 3.在多线程的情况下，使用JUC并发包下 CopyOnWriteArrayList 集合
 */
public class IteratorDemo {
    //方式一：加强foreach循环
    public static void testForeach(Collection<String> c){
        //for(元素类型  临时变量名 : 集合名){}
        for (String string : c) {
            if(string.equals("111")){
                //抛出异常  ConcurrentModificationException
                c.remove(string);
            }
        }
    }

    //方式二：Iterator迭代器
    public static void testIterator(Collection<String> c){
        //获取迭代器
        Iterator<String> iterator = c.iterator();
        //判断是否有下一个值
        while (iterator.hasNext()){
            //取值
            String s = iterator.next();
            if(s.equals("111")){
                //c.remove(s);
                //迭代器提供的移除API
                iterator.remove();
            }
        }
    }

    //方式三：通过下标循环
    public static void testIndex(ArrayList<String> c){
        for (int i = 0; i < c.size(); i++) {
            String string = c.get(i);
            if(string.equals("111")){
                c.remove(string);
            }
        }
    }

    //方式四：Stream流和方法引用
    public static void testStream(Collection<String> c){
        /*c.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("s = "+s);
            }
        });*/

        //Lambda表达式简化
        //c.stream().forEach(s-> System.out.println("s = "+s));

        //方法引用简化
        c.stream().forEach(System.out::println);
    }

    public static void main(String[] args) {
        //Collection<String> c2 = new ArrayList<>();
        ArrayList<String> c2 = new ArrayList<>();
        c2.add("111");
        c2.add("222");
        c2.add("333");
        c2.add("123");

        /*testForeach(c2);
        System.out.println(c2);*/

        /*testIterator(c2);
        System.out.println(c2);*/

        testIndex(c2);
        System.out.println(c2);

        /*testStream(c2);*/
    }

}
